package com.web.common.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class DateFormatUtil {
	
	/**
	 *  备注
	 * 	java.util.Date是在除了SQL语句的情况下面使用的。 java.sql.Date是针对SQL语句使用的，它只包含日期而没有时间部分.
	 *	因为PreparedStament的setDate()的第2参数和ResultSet的getDate()方法的第2个参数都是java.sql.Date
	 *	final java.sql.Date insertDate = new java.sql.Date(System.currentTimeMillis());
	 */
	
	
	/**
	 * 普通日期格式，不带时分秒
	 */
	public static final String DATE_FORMAT = "yyyy-MM-dd";
	/**
	 * 特殊日期格式，带时分秒
	 */
	public static final String DATE_FORMAT_SFM = "yyyy-MM-dd HH:mm:ss";

	/**
	 * 根据指定时间和指定格式获取格式化日期
	 * 
	 * @param time long类型的数据类型
	 * @param format 指定的格式
	 * @return
	 */
	public static String getDateByTime(long time, String format) {
		Date date = new Date(time);
		SimpleDateFormat sDateformat = new SimpleDateFormat(format);
		return sDateformat.format(date).toString();
	}

	/**
	 * 以指定的格式将String日期类型转化为long类型
	 * 
	 * @param dateStr
	 * @param format 
	 * @return
	 */
	public static long getTimeByDateStr(String dateStr, String format) {
		if (dateStr == null || "".equals(dateStr) || null == format
				|| "".equals(format)) {
			return 0L;
		}
		SimpleDateFormat f = new SimpleDateFormat(format);
		Date date = null;
		try {
			date = f.parse(dateStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		long rtn;
		if (date == null) {
			rtn = 0L;
		} else {
			rtn = date.getTime();
		}
		return rtn;
	}

	/**
	 * 获取Calendar实例
	 * 
	 * @return Calendar
	 */
	public static Calendar getCalendar() {
		Calendar calendar = Calendar.getInstance(TimeZone
				.getTimeZone("GMT+8:00"));
		calendar.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
		// calendar.get(Calendar.HOUR_OF_DAY);
		// calendar.set(Calendar.HOUR, Calendar.HOUR_OF_DAY);
		return calendar;
	}

	/**
	 * 获取当前年份
	 * 
	 * @return
	 */
	public static int getCurrentYear() {
		return getCalendar().get(Calendar.YEAR);
	}

	/**
	 * 获取当前月份
	 * 
	 * @return
	 */
	public static int getCurrentMonth() {
		return getCalendar().get(Calendar.MONTH) + 1;
	}

	/**
	 * 获取当前天份
	 * 
	 * @return
	 */
	public static int getCurrentDate() {
		return getCalendar().get(Calendar.DATE);
	}

	/**
	 * string转date类型
	 * @param dateStr 要转换的时间字符串
	 * @param dateFormat 指定的格式，是否带时分秒
	 * @return java.util.date类型的数据
	 */
	public static Date str2date(String dateStr,String dateFormat) {
		Date parseDate = null;
		try {
			SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
			parseDate = sdf.parse(dateStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return parseDate;
	}

	/**
	 * date转string类型
	 * @param date 要转换的时间
	 * @param dateFormat 指定的格式
	 * @return 字符串类型的时间数据
	 */
	public static String date2str(Date date,String dateFormat) {
		SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
		return date == null ? "":sdf.format(date);
	}

	/**
	 * timestamp转str类型,带时分秒
	 * 
	 * @throws ParseException
	 */
	public static String timestamp2str(long timestamp,String dateformat) {
		SimpleDateFormat format = new SimpleDateFormat(dateformat);
		String d = format.format(timestamp);
		return d;
	}

	/**
	 * timestamp转Date类型,带时分秒
	 * 
	 * @throws ParseException
	 */
	public static Date timestamp2date(long timestamp,String dateformat) {
		Date parseDate = null;
		try {
			SimpleDateFormat format = new SimpleDateFormat(dateformat);
			String d = format.format(timestamp);
			parseDate = format.parse(d);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return parseDate;
	}

	/**
	 * str转timestamp类型,带时分秒
	 * 
	 * @throws ParseException
	 */
	public static long str2timestamp(String datestr,String dateformat) {
		long timestamp = 0;
		try {
			SimpleDateFormat format = new SimpleDateFormat(dateformat);
			Date date = format.parse(datestr);
			timestamp = date.getTime();
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return timestamp;
	}

	/**
	 * 获取两个日期之间间隔的天数
	 */
	public static long getQuot(String time1, String time2) {
		long quot = 0;
		SimpleDateFormat ft = new SimpleDateFormat(DATE_FORMAT);
		/*
		 * time1=ft.format(time1); time2=ft.format(time2);
		 */
		try {
			Date date1 = ft.parse(time1);
			Date date2 = ft.parse(time2);
			quot = date1.getTime() - date2.getTime();
			quot = quot / 1000 / 60 / 60 / 24;
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return quot;
	}
	
	/**
	 * 得到当前日期与指定日期的相隔的天数
	 * @param nowdate 当前日期
	 * @param time 指定日期
	 * @return 相隔天数
	 */
	public static int getNowDateQuot(String time) {
		String nowDate = DateFormatUtil.date2str(new Date(),DATE_FORMAT);
		long quot = DateFormatUtil.getQuot(nowDate,time);
		int quotInt = Integer.parseInt(String.valueOf(quot));
		return quotInt;
	}

	/**
	 * 获取当前的时间str类型
	 * 
	 * @return yyyy-MM-dd HH:mm:ss
	 */
	public static String getNowDate() {
		SimpleDateFormat ft = new SimpleDateFormat(DATE_FORMAT_SFM);
		Date dd = new Date();
		return ft.format(dd);
	}

	/**
	 * Java查询MySQL日期时间数据类型带微秒的解决办法
	 * 
	 * @param date
	 * @return
	 */
	public static String getFullFormateString(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_SFM);
		return date == null ? "" : sdf.format(date);
	}
	
	/**
	 * 增加天数
	 * @param date
	 * @param num
	 * @return
	 */
	public static Date addDay(Date date, int num) {
		  Calendar startDT = Calendar.getInstance();
		  startDT.setTime(date);
		  startDT.add(Calendar.DAY_OF_MONTH, num);
		  return startDT.getTime();
    }
}
